#pragma once
#include <hpluginloader.h>
#include <hirop/vision/c_base_detector.h>
#include <opencv2/aruco.hpp>

using namespace hirop_vision;

class ArDetector: public CBaseDetector{

public:

    ArDetector();

    /**
     * @brief   实现具体的识别功能
     * @return  0 成功 -1 失败
     */
    int detection();

    /**
     * @brief   加载相关的训练结果
     * @param   [objectName] 需要识别的物体
     * @return  0 成功 -1 失败
     */
    int loadData(const std::string path, const std::string objectName);

    /**
     * @brief   获取识别的结果
     * @param[out] poses， 保存识别的结果
     * @return  0 成功 -1 失败
     */
    int getResult(std::vector<pose> &poses);

    /**
     * @brief   向检测器传递图像数据
     * @param   [inputImg] 输入，传递的图像
     * @return  void
     */
    void setDepthImg(const cv::Mat &inputImg);

    /**
     * @brief   向检测器传递图像数据
     * @param   [inputImg] 输入，传递的图像
     * @return  void
     */
    void setColorImg(const cv::Mat &inputImg);

    /**
     * @brief   解析识别器私有训练器配置，具体由相关识别器实现
     * @return void
     */
    int parseConfig(const YAML::Node &node);

    /**
     * @brief   获取识别过程中的预览图片
     * @param perImg[out]   预览图片
     * @return      0 正常获取到预览图片 -1 反之
     */
    int getPreImg(cv::Mat &preImg);

private:


    /**
     * @brief _colorImg 用于保存由框架传递下来的彩色图片
     */
    cv::Mat _colorImg;

    /**
     * @brief _depthrImg 用于保存由框架传递下来的深度图片
     */
    cv::Mat _depthrImg;

    cv::Mat  cameraMatrix,distCoeffs; //

    cv::Ptr<cv::aruco::Dictionary> dictionary;

    cv::Mat monoImage, preImage;

    //result
    std::vector<cv::Vec3d> retRvecs, tVecs;


};

H_DECLARE_PLUGIN(IDetector)
